#include"tcp_client.h"
#include<string.h>
#include"echoMessage.pb.h"
#include<time.h>
#include<pthread.h>


struct Qps{
    Qps(){
        last_time = time(NULL);
        succ_cnt = 0;
    }
    long last_time;     // 最后一次发包的时间，以ms为单位
    int succ_cnt;       // 成功收到服务器回显业务的次数
};


// 设置路由分发机制
// typedef void msg_callback(const char *data, uint32_t len, int msgid, net_connection* net_conn, void *args);
void qps_test(const char *data, uint32_t len, int msgid, net_connection* net_conn, void *args){
    Qps *qps = (Qps*)args;
    
    protobuf_test::EchoMessage request, response;

    // 解析server发过来的数据
    if(response.ParseFromArray(data, len) == false){
        perror("server call back data error\n");
        exit(1);
    }

    // 判断消息内容是否一致
    if(response.content() == "QPS test!\n"){
        // 当前服务器的回显业务成功，qps成功一次
        // printf("call back succ!\n");
        qps->succ_cnt++;
    }

    // 得到当前时间
    long current_time = time(NULL);
    if(current_time-qps->last_time >= 1){
        // 如果当前时间与刚开始记录的时间相差1s，则统计当前QPS成功的次数
        printf("call back succ! qps:[%d]\n",qps->succ_cnt);
        
        // 更新数据
        qps->last_time = time(NULL);
        qps->succ_cnt = 0;
    }

    // 发送request给服务器
    request.set_id(response.id()+1);
    request.set_content(response.content());

    // 将response序列化
    std::string requeseString;
    request.SerializeToString(&requeseString);
    
    // 将数据发给服务器
    net_conn->send_message(requeseString.c_str(), requeseString.size(), msgid);

}



// 设置创建链接和关闭连接的hook函数
// typedef void (*conn_callback)(net_connection *conn, void *args);
void on_client_build(net_connection *conn, void *args){
    // 当根server简历连接后主动给server发送一个包
    protobuf_test::EchoMessage request;
    
    request.set_id(1);
    request.set_content("QPS test!\n");
    
    // 将response序列化
    std::string requeseString;
    request.SerializeToString(&requeseString);
    
    // 将数据发给服务器
    int msgid = 1;
    conn->send_message(requeseString.c_str(), requeseString.size(), msgid);

}

void *thread_main(void *args=NULL){
    event_loop loop;
    //创建套接字
    tcp_client client(&loop,"127.0.0.1", 7777);

    // 创建一个QPS记录
    Qps qps;
    
    // 注册一个回调业务
    client.add_msg_router(1, qps_test, (void *)&qps);

    client.set_conn_start(on_client_build);
    
    // 进入循环开始监听
    loop.event_process();

    return NULL;
}

int main(int argc, char* argv[]){
    int thread_num = 0;
    if(argc == 1){
        thread_num = 1;
        printf("thread:[%d]\n", thread_num);
    }
    else{
        
        thread_num = atoi(argv[1]);
        printf("thread:[%d]\n", thread_num);
    }

    pthread_t *tids;
    tids = new pthread_t[thread_num];

    for(int i=0; i<thread_num; i++){
        pthread_create(&tids[i], NULL, thread_main, NULL);
    }

    for(int i=0; i<thread_num; i++){
        pthread_join(tids[i], NULL);
    }
    
    return 0;
}
